package com.br.android.widing;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Currency;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.br.android.widing.adapter.ListCategoriaGanhosAdapter;
import com.br.android.widing.adapter.ListGanhosAdapter;
import com.br.android.widing.adapter.ListGastosAdapter;
import com.br.android.widing.adapter.ListGastosPorCategoriaAdapter;
import com.br.android.widing.db.WidingCategoriaDAO;
import com.br.android.widing.db.WidingCursor;
import com.br.android.widing.db.WidingDAO;
import com.br.android.widing.db.WidingGanhoCursor;
import com.br.android.widing.db.WidingGanhosDAO;
import com.br.android.widing.entity.Categoria;
import com.br.android.widing.entity.Ganho;
import com.br.android.widing.entity.Gasto;

public class PrincipalActivity extends SherlockFragmentActivity implements
		ActionBar.TabListener {

	SectionsPagerAdapter mSectionsPagerAdapter;

	ViewPager mViewPager;

	private String[] modos;

	private WidingDAO dao;
	private WidingCursor cursor;
	private static List<Gasto> listGastos;
	private static List<Gasto> listGastosPorCategoria;

	private WidingGanhosDAO ganhosDAO;
	private WidingGanhoCursor cursorGanhos;
	private static List<Ganho> listGanhos;
	private static List<Ganho> listGanhosPorCategoria;
	private static double valorTotalGanhos;

	// vari�vel para valor total dos gastos
	private static double valorTotalGastos;
	Currency currency = Currency.getInstance(Locale.getDefault());
	private static DecimalFormat format;

	private static Context contextThis;
	private static Activity activityThis;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_principal);

		WidingCategoriaDAO daoCategoria = new WidingCategoriaDAO(this);
		if(daoCategoria.consultarCategorias().getCount() == 0){
			inserirCategoriasPadroes();
		}

		format = new DecimalFormat(currency.getSymbol() + " ###,###,##0.00");

		final ActionBar actionBar = getSupportActionBar();
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

		mSectionsPagerAdapter = new SectionsPagerAdapter(
				getSupportFragmentManager());
		mViewPager = (ViewPager) findViewById(R.id.pager);
		mViewPager.setAdapter(mSectionsPagerAdapter);

		mViewPager
				.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

					@Override
					public void onPageSelected(int position) {
						actionBar.setSelectedNavigationItem(position);
					}

				});

		for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
			actionBar.addTab(actionBar.newTab()
					.setText(mSectionsPagerAdapter.getPageTitle(i))
					.setTabListener(this));
		}

		contextThis = this;
		activityThis = this;

		// busca os gastos no banco
		dao = new WidingDAO(this);
		listGastos = new ArrayList<Gasto>();
		listGastosPorCategoria = new ArrayList<Gasto>();
		cursor = dao.getAll();
		for (int i = 0; i < cursor.getCount(); i++) {
			cursor.moveToPosition(i);
			Gasto gasto = new Gasto();
			gasto.setIdGasto(cursor.getIdGasto());
			gasto.setNomeGasto(cursor.getNomeGasto());
			gasto.setCategoria(cursor.getCategoriaGasto());
			gasto.setDataCadastro(cursor.getDataGasto());
			gasto.setValor(cursor.getValorGasto());
			listGastos.add(gasto);
		}

		cursor = dao.getTotalValores();
		valorTotalGastos = cursor.getSomaValores();

		cursor = dao.getTotalValoresPorCategoria();
		for (int i = 0; i < cursor.getCount(); i++) {
			cursor.moveToPosition(i);
			Gasto gasto = new Gasto();
			gasto.setCategoria(cursor.getCategoriaGasto());
			gasto.setValor(cursor.getSomaValoresPorCategoria());
			listGastosPorCategoria.add(gasto);
		}

		// consulta dos ganhos
		listGanhos = new ArrayList<Ganho>();
		ganhosDAO = new WidingGanhosDAO(this);
		cursorGanhos = ganhosDAO.getAll();
		for (int i = 0; i < cursorGanhos.getCount(); i++) {
			cursorGanhos.moveToPosition(i);
			Ganho ganho = new Ganho();
			ganho.setIdGanho(cursorGanhos.getIdGanho());
			ganho.setNomeGanho(cursorGanhos.getNomeGanho());
			ganho.setCategoriaGanho(cursorGanhos.getCategoriaGanho());
			ganho.setValorGanho(cursorGanhos.getValorGanho());
			ganho.setDataGanho(cursorGanhos.getDataGanho());
			listGanhos.add(ganho);
		}

		// consulta por categoria dos ganhos
		listGanhosPorCategoria = new ArrayList<Ganho>();
		cursorGanhos = ganhosDAO.getTotalValoresPorCategoria();
		for (int i = 0; i < cursorGanhos.getCount(); i++) {
			cursorGanhos.moveToPosition(i);
			Ganho ganho = new Ganho();
			ganho.setCategoriaGanho(cursorGanhos.getCategoriaGanho());
			ganho.setValorGanho(cursorGanhos.getValorPorCategoria());
			listGanhosPorCategoria.add(ganho);
		}

		cursorGanhos = ganhosDAO.getTotalValores();
		valorTotalGanhos = cursorGanhos.getSomaValores();

		ganhosDAO.close();
		cursorGanhos.close();

		dao.close();
		cursor.close();

		mViewPager.setCurrentItem(1);
	}

	/**
	 * Inflando o menu para adicionar um novo gasto
	 *
	 * @author Marcelo de Araujo
	 * @since 19/08/2012
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getSupportMenuInflater();
		inflater.inflate(R.menu.menu_principal, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.menu_novo_gasto:
			AlertDialog alert = new AlertDialog.Builder(this).create();
			alert.setTitle("Widing");
			alert.setMessage("Escolha uma das op\u00e7\u00f5es abaixo:");
			alert.setButton(AlertDialog.BUTTON_NEUTRAL, "Gastos",
					new DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							startActivity(new Intent(PrincipalActivity.this,
									AdicionarGastoActivity.class));
							overridePendingTransition(android.R.anim.fade_in,
									android.R.anim.fade_out);
							dialog.dismiss();
							finish();
						}
					});
			alert.setButton(AlertDialog.BUTTON_NEGATIVE, "Ganhos",
					new DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							startActivity(new Intent(PrincipalActivity.this,
									AdicionarGanhoActivity.class));
							overridePendingTransition(android.R.anim.fade_in,
									android.R.anim.fade_out);
							dialog.dismiss();
							finish();
						}
					});
			alert.setButton(AlertDialog.BUTTON_POSITIVE, "Categorias",
					new DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							startActivity(new Intent(PrincipalActivity.this,
									ListaCategoriasActivity.class));
							overridePendingTransition(android.R.anim.fade_in,
									android.R.anim.fade_out);
							dialog.dismiss();
							finish();
						}
					});
			alert.show();
			break;
		}
		return true;
	}

	/**
	 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
	 * one of the primary sections of the app.
	 */
	public class SectionsPagerAdapter extends FragmentPagerAdapter {

		public SectionsPagerAdapter(FragmentManager fm) {
			super(fm);
		}

		@Override
		public Fragment getItem(int i) {
			Fragment fragment = new DummySectionFragment();
			Bundle args = new Bundle();
			args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, i + 1);
			fragment.setArguments(args);
			return fragment;
		}

		@Override
		public int getCount() {
			return 3;
		}

		@Override
		public CharSequence getPageTitle(int position) {
			switch (position) {
			case 0:
				return getString(R.string.title_section1).toUpperCase();
			case 1:
				return getString(R.string.title_section2).toUpperCase();
			case 2:
				return getString(R.string.title_section3).toUpperCase();
			}
			return null;
		}
	}

	/**
	 * A dummy fragment representing a section of the app, but that simply
	 * displays dummy text.
	 */
	public static class DummySectionFragment extends Fragment {
		public DummySectionFragment() {
		}

		@Override
		public void onSaveInstanceState(Bundle outState) {
			super.onSaveInstanceState(outState);
			setUserVisibleHint(true);
		}

		public static final String ARG_SECTION_NUMBER = "section_number";

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View view = null;
			Bundle args = getArguments();
			if (args.getInt(ARG_SECTION_NUMBER) == 1) {
				view = inflater.inflate(R.layout.layout_categorias, null);

				final Spinner spinner = (Spinner) view
						.findViewById(R.id.spinnerEscolhaCategoria);
				spinner.setPrompt("Op\u00e7\u00f5es de filtro");
				final ListView listCategorias = (ListView) view
						.findViewById(R.id.listViewValorPorCategorias);
				spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

					@Override
					public void onItemSelected(AdapterView<?> adapterView,
							View v, int position, long longId) {
						if (spinner.getItemAtPosition(position).toString()
								.equals("Gastos")) {
							ListGastosPorCategoriaAdapter adapter = new ListGastosPorCategoriaAdapter(
									contextThis, listGastosPorCategoria);
							listCategorias.setAdapter(adapter);
						} else if (spinner.getItemAtPosition(position)
								.toString().equals("Ganhos")) {
							ListCategoriaGanhosAdapter adapter = new ListCategoriaGanhosAdapter(
									contextThis, listGanhosPorCategoria);
							listCategorias.setAdapter(adapter);
						}
					}

					@Override
					public void onNothingSelected(AdapterView<?> adapterView) {
						Toast.makeText(getActivity(), "Nada selecionado",
								Toast.LENGTH_SHORT).show();
					}
				});

				ListView listViewGastosPorCategoria = (ListView) view
						.findViewById(R.id.listViewValorPorCategorias);
				ListGastosPorCategoriaAdapter adapter = new ListGastosPorCategoriaAdapter(
						contextThis, listGastosPorCategoria);
				listViewGastosPorCategoria.setAdapter(adapter);
			}
			if (args.getInt(ARG_SECTION_NUMBER) == 2) {
				view = inflater.inflate(R.layout.layout_principal_list_gastos,
						null);
				TextView valorTotal = (TextView) view
						.findViewById(R.id.textViewValorTotalGastos);
				valorTotal.setText(format.format(valorTotalGastos));
				ListView listViewGastos = (ListView) view
						.findViewById(R.id.listViewGastos);
				ListGastosAdapter adapter = new ListGastosAdapter(contextThis,
						listGastos);
				listViewGastos.setAdapter(adapter);
				listViewGastos
						.setOnItemClickListener(new OnItemClickListener() {
							@Override
							public void onItemClick(AdapterView<?> adapterView,
									View viewClick, int position, long id) {
								Gasto gasto = listGastos.get(position);
								Intent intent = new Intent(contextThis,
										ExibicaoItemActivity.class);
								intent.putExtra("id", gasto.getIdGasto());
								intent.putExtra("valor", gasto.getValor());
								intent.putExtra("nomegasto",
										gasto.getNomeGasto());
								intent.putExtra("categoria",
										gasto.getCategoria());
								intent.putExtra("data", gasto.getDataCadastro());
								startActivity(intent);
								activityThis.overridePendingTransition(
										android.R.anim.fade_in,
										android.R.anim.fade_out);
								activityThis.finish();
							}
						});

			}
			if (args.getInt(ARG_SECTION_NUMBER) == 3) {
				view = inflater.inflate(R.layout.layout_list_ganhos, null);
				TextView textViewTotal = (TextView) view
						.findViewById(R.id.textViewValorTotalGanhos);
				textViewTotal.setText(format.format(valorTotalGanhos));
				ListView listViewGanhos = (ListView) view
						.findViewById(R.id.listViewGanhos);
				ListGanhosAdapter adapter = new ListGanhosAdapter(contextThis,
						listGanhos);
				listViewGanhos.setAdapter(adapter);
				listViewGanhos
						.setOnItemClickListener(new OnItemClickListener() {

							@Override
							public void onItemClick(AdapterView<?> adapterView,
									View viewClick, int position, long id) {
								Ganho ganho = listGanhos.get(position);
								Intent intent = new Intent(contextThis,
										ExibicaoGanhoActivity.class);
								intent.putExtra("id", ganho.getIdGanho());
								intent.putExtra("nomeganho",
										ganho.getNomeGanho());
								intent.putExtra("categoriaganho",
										ganho.getCategoriaGanho());
								intent.putExtra("dataganho",
										ganho.getDataGanho());
								intent.putExtra("valorganho",
										ganho.getValorGanho());
								startActivity(intent);
								activityThis.overridePendingTransition(
										android.R.anim.fade_in,
										android.R.anim.fade_out);
								activityThis.finish();
							}
						});
			}
			return view;
		}

		// m�todo sem utiliza��o por enquanto
		@Override
		public void onCreateContextMenu(ContextMenu menu, View v,
				ContextMenuInfo menuInfo) {
			AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
			menu.setHeaderTitle(listGastos.get(info.position).getNomeGasto());
			menu.add(Menu.NONE, 1, Menu.NONE, "Adicionar nota");
		}
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (event.getAction() == KeyEvent.ACTION_DOWN) {
			finish();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

	@Override
	public void onTabSelected(Tab tab, FragmentTransaction ft) {
		mViewPager.setCurrentItem(tab.getPosition());
	}

	@Override
	public void onTabUnselected(Tab tab, FragmentTransaction ft) {
	}

	@Override
	public void onTabReselected(Tab tab, FragmentTransaction ft) {
	}

	private void inserirCategoriasPadroes() {
		WidingCategoriaDAO daoCategoria = new WidingCategoriaDAO(this);
		String[] categorias = { "Geral", "Restaurante", "Mercado", "Bar",
				"Happy Hour", "Lanche", "Combust\u00edvel", "Eletr\u00f4nicos",
				"Jogos", "Roupas", "Cal\u00e7ados","TESTE" };
		Categoria cat;
		int cont = 0;
		for (String categoria : categorias) {
			cat = new Categoria();
			cat.setIdcategoria(cont++);
			cat.setNomecategoria(categoria);
			daoCategoria.inserirAtualizarCategoria(cat);
		}
	}
}
